#ifndef CAMERA_HPP
#define CAMERA_HPP

//------------------------------------------------------------------------------
// Fichier d'entete utilises
//------------------------------------------------------------------------------
#include <Math/Vector.hpp>
#include <Math/Matrix.hpp>
#include <Rendering/Projection.hpp>
#include <Settings.hpp>

namespace Rendering {

class Camera : public IPointOfView
{
public:

	//----------------------------------------------------------------------
	// Constructeur
	//----------------------------------------------------------------------
	Camera(float fov=DEFAULT_FIELD_OF_VIEW, float near=NEAR_VALUE, float far=FAR_VALUE);

    //----------------------------------------------------------------------
	// Destructeur
	//----------------------------------------------------------------------
	virtual ~Camera();

	//----------------------------------------------------------------------
	// Permet d'afficher sur la sortie standard les informations concernant
	// la position, la direction et l'orientation de la camera
	//----------------------------------------------------------------------
	void Print( );

	//----------------------------------------------------------------------
	// Deplace la camera verticalement
	//
	// distance : distance de deplacement
	//----------------------------------------------------------------------
	void MoveVertical( float distance );

	//----------------------------------------------------------------------
	// Deplace la camera horizontalement
	//
	// distance : distance de deplacement
	//----------------------------------------------------------------------
	void MoveHorizontaly( float distance );

	//----------------------------------------------------------------------
	// Deplace la camera en profondeur
	//
	// distance : distance de deplacement
	//----------------------------------------------------------------------
	void MoveDeeply( float distance );

	//----------------------------------------------------------------------
	// Tourne la camera sur elle meme selon l'axe et l'angle donne
	//
	// axis : axe de rotation
	// angle : angle de rotation
	//----------------------------------------------------------------------
	void RotateCameraAxis( float* axis, float angle );

	//----------------------------------------------------------------------
	// Tourne la camera sur elle meme selon l'axe up et selon l'axe right
	//
	// angleX : angle de rotation selon l'axe right
	// angleY : angle de rotation selon l'axe Up
	//----------------------------------------------------------------------
	void RotateCamera( float angleX, float angleY );
		
	//----------------------------------------------------------------------
	//
	//----------------------------------------------------------------------
	Vector::Vector4 Position;  // Point
	Vector::Vector4 Direction; // Vecteur
	Vector::Vector4 Up;        // Vecteur

	Matrix::Matrix4 matInverse;
protected:
	// Forbidden constructor or operator
	Camera( Camera& copy );
	Camera& operator=( Camera& copy );
	// Update point of view matrix
	virtual void UpdateProjectionMatrix();
	virtual void UpdateViewMatrix();
};

}

#endif //CAMERA_HPP
